from PyQt6.QtCore import QThread, pyqtSignal, Qt
from PyQt6.QtWidgets import QApplication, QLabel, QPushButton, QVBoxLayout, QWidget
import random
import sys
import time

class WorkerThread(QThread):
    # 定义一个信号，传递一个字符串参数
    update_label_signal = pyqtSignal(str)

    def __init__(self):
        super().__init__()
        self._running = True  # 标志变量用于控制线程运行

    def run(self):
        # 模拟长时间运行的任务
        while self._running:
            for  i in range(100):
                # 生成一个随机数
                random_number = random.randint(0, 10)
                # 发射信号
                self.update_label_signal.emit(str(random_number))
                # 休眠一秒
                time.sleep(1)
                if i >=20:

                    self._running=False
                    break


    def stop(self):
        self._running = False  # 设置标志为 False，通知线程停止

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()

        # 创建UI组件
        self.label = QLabel("Press the button", self)
        self.label.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.button = QPushButton("Start Updating", self)

        # 设置布局
        layout = QVBoxLayout(self)
        layout.addWidget(self.label)
        layout.addWidget(self.button)

        # 创建线程
        self.thread = WorkerThread()

        # 连接线程信号到槽
        self.thread.update_label_signal.connect(self.update_label)

        # 连接按钮点击事件
        self.button.clicked.connect(self.start_thread)

    def start_thread(self):
        # 启动线程
        if not self.thread.isRunning():
            self.thread._running = True  # 重新设置运行标志
            self.thread.start()
            # 在这里不需要立即调用 stop() 和 wait()
            # 让线程自然运行，直到通过其他方式（如 GUI）停止

    def update_label(self, text):
        # 更新标签文本
        self.label.setText(text)

# 创建应用程序和窗口
if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.show()
    sys.exit(app.exec())
